"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MiniLayout = void 0;

var _react = _interopRequireWildcard(require("react"));

var _classnames = _interopRequireDefault(require("classnames"));

var _eventemitter = _interopRequireDefault(require("eventemitter3"));

var _components = require("@tarojs/components");

var _icon = _interopRequireDefault(require("../../icon"));

var _noop = require("../../../utils/noop");

var _configContext = require("../../../extends/configContext");

var _interface = require("../interface");

var _spin = _interopRequireDefault(require("../../spin"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

var ToastEmitter = /*#__PURE__*/function (_EventEmitter) {
  _inherits(ToastEmitter, _EventEmitter);

  var _super = _createSuper(ToastEmitter);

  function ToastEmitter() {
    _classCallCheck(this, ToastEmitter);

    return _super.apply(this, arguments);
  }

  return ToastEmitter;
}(_eventemitter.default);

var toastEmitter = new ToastEmitter();

function Toast(props) {
  var _useConfig = (0, _configContext.useConfig)(),
      clsPrefix = _useConfig.clsPrefix;

  var _useState = (0, _react.useState)(props),
      _useState2 = _slicedToArray(_useState, 2),
      options = _useState2[0],
      setOptions = _useState2[1];

  var _useState3 = (0, _react.useState)("".concat(clsPrefix, "-toast__fadeIn")),
      _useState4 = _slicedToArray(_useState3, 2),
      fadeClassName = _useState4[0],
      setFadeClassName = _useState4[1];

  var timerRef = (0, _react.useRef)(null);

  var clearToast = function clearToast() {
    var _timerRef$current, _timerRef$current2;

    // 处理现存toast实例的close回调和清除定时器
    if (typeof ((_timerRef$current = timerRef.current) === null || _timerRef$current === void 0 ? void 0 : _timerRef$current.onClose) === 'function') {
      timerRef.current.onClose();
    }

    clearTimeout((_timerRef$current2 = timerRef.current) === null || _timerRef$current2 === void 0 ? void 0 : _timerRef$current2.timeoutId);
    timerRef.current = null;
  };

  (0, _react.useEffect)(function () {
    // 关闭逻辑
    var onHide = function onHide() {
      setFadeClassName("".concat(clsPrefix, "-toast__fadeOut"));
      clearToast();
    };

    var onShow = function onShow(options) {
      clearToast();
      setFadeClassName("".concat(clsPrefix, "-toast__fadeIn"));
      setOptions(options);
      timerRef.current = {};

      if (typeof options.onClose === 'function') {
        timerRef.current.onClose = options.onClose;
      }

      if (options.duration !== 0) {
        timerRef.current.timeoutId = setTimeout(onHide, options.duration);
      }
    };

    toastEmitter.on('show', onShow);
    toastEmitter.on('hide', onHide);
    return function () {
      var _timerRef$current3;

      clearTimeout((_timerRef$current3 = timerRef.current) === null || _timerRef$current3 === void 0 ? void 0 : _timerRef$current3.timeoutId);
      toastEmitter.removeListener('show', onShow);
      toastEmitter.removeListener('hide', onHide);
    };
  }, []);
  var visible = options.visible,
      icon = options.icon,
      _options$type = options.type,
      type = _options$type === void 0 ? 'info' : _options$type,
      content = options.content,
      _options$hasMask = options.hasMask,
      hasMask = _options$hasMask === void 0 ? false : _options$hasMask,
      _options$position = options.position,
      position = _options$position === void 0 ? 'center' : _options$position,
      className = options.className,
      _options$style = options.style,
      style = _options$style === void 0 ? {} : _options$style,
      onMaskClick = options.onMaskClick;

  var toast = /*#__PURE__*/_react.default.createElement(_components.View, {
    className: (0, _classnames.default)("".concat(clsPrefix, "-toast"), className, "".concat(clsPrefix, "-toast--").concat(position), fadeClassName, {
      'is-show': visible
    }),
    style: style,
    onAnimationEnd: function onAnimationEnd(e) {
      if (e.detail.animationName === 'fadeOut') {
        setOptions(function () {
          return {
            visible: false
          };
        });
      }
    }
  }, _interface.typeIconMap[type] && (type === 'loading' ? /*#__PURE__*/_react.default.createElement(_spin.default, {
    size: 24,
    type: "spinner",
    className: (0, _classnames.default)("".concat(clsPrefix, "-toast__icon"))
  }) : /*#__PURE__*/_react.default.createElement(_icon.default, {
    className: (0, _classnames.default)("".concat(clsPrefix, "-toast__icon")),
    size: 24,
    name: _interface.typeIconMap[type]
  })), !_interface.typeIconMap[type] && icon && /*#__PURE__*/_react.default.createElement(_icon.default, {
    className: (0, _classnames.default)("".concat(clsPrefix, "-toast__icon")),
    size: 24,
    name: icon
  }), /*#__PURE__*/_react.default.createElement(_components.Text, {
    className: "".concat(clsPrefix, "-toast__text")
  }, content));

  if (hasMask && visible) {
    toast = /*#__PURE__*/_react.default.createElement(_components.View, {
      onClick: onMaskClick,
      className: "".concat(clsPrefix, "-toast--mask")
    }, toast);
  }

  return toast;
}

var show = function show(type) {
  return function (_ref) {
    var content = _ref.content,
        _ref$duration = _ref.duration,
        duration = _ref$duration === void 0 ? 1500 : _ref$duration,
        _ref$hasMask = _ref.hasMask,
        hasMask = _ref$hasMask === void 0 ? false : _ref$hasMask,
        _ref$onClose = _ref.onClose,
        onClose = _ref$onClose === void 0 ? _noop.noop : _ref$onClose,
        _ref$position = _ref.position,
        position = _ref$position === void 0 ? 'center' : _ref$position,
        className = _ref.className,
        _ref$style = _ref.style,
        style = _ref$style === void 0 ? {} : _ref$style,
        _ref$onMaskClick = _ref.onMaskClick,
        onMaskClick = _ref$onMaskClick === void 0 ? _noop.noop : _ref$onMaskClick;
    return toastEmitter.emit('show', {
      visible: true,
      type: type,
      content: content,
      duration: duration,
      hasMask: hasMask,
      onClose: onClose,
      position: position,
      className: className,
      style: style,
      onMaskClick: onMaskClick
    });
  };
};

Toast.info = show('info');
Toast.success = show('success');
Toast.warning = show('warning');
Toast.error = show('error');
Toast.loading = show('loading');

Toast.hide = function () {
  return toastEmitter.emit('hide');
};

var MiniLayout = function MiniLayout() {
  return Toast;
};

exports.MiniLayout = MiniLayout;